drewnik99 (Normal User)
Pro
Messaggi: 69
Iscritto: 28/03/2008
|
Devo dichiarare un array di strurre vuoto e poi nel corso del programma riallocare la memoria per l'array ogni volta che vi aggiungo una struttura. Prima però devo utilizzare malloc? La dichiarazione è corretta?
Codice sorgente - presumibilmente C/C++ |
struct comp pa[0], *ppa = pa;
|
Se utilizzo malloc, il compilatore restituisce un errore.
Codice sorgente - presumibilmente Plain Text |
pa = malloc(sizeof(struct comp));
|
Qualche suggerimento? Grazie mille in anticipo per qualsialsi risposta. |
|
comina8 (Normal User)
Pro
Messaggi: 86
Iscritto: 18/06/2011
|
Allora...array di strutture vuol dire puntatore ad una cella di memoria che conterrà via via tutte gli elementi dell'array...
Codice sorgente - presumibilmente C/C++ |
vuol dire dichiarare un array vuoto non più modificabile.
Codice sorgente - presumibilmente C/C++ |
Vuol dire dichiarare un puntatore che, se inizializzato allocando l'apposita memoria, costituirà un array (o altro ma in questo caso non ci interessa).
Quindi:
Codice sorgente - presumibilmente C/C++ |
struct ciao *array;
array=(struct ciao*)malloc(NumeroElementiArray*sizeof(struct ciao));
array[0].elementoStruttura=qualcosa;
... //etc etc...
|
Una volta dichiarato un puntatore lo puoi allocare dove vuoi e quando ti serve, ricordati solo di liberare la memoria quando non la usi più:
Codice sorgente - presumibilmente Plain Text |
|
|
drewnik99 (Normal User)
Pro
Messaggi: 69
Iscritto: 28/03/2008
|
Posto tutta la funzione:
Codice sorgente - presumibilmente C++ |
struct comp *comps = 0; struct comp *ccompx(const char name[]) { struct comp *p; struct comp *pa; glob = 0; pa = (struct comp*) malloc(sizeof(struct comp)); if(!pa) { puts("Ricerca interrotta."); return 0; } int s; for(p = comps, s = 1; p; p = p->n, s++) { int i = 0; for(; name[i] != p->name[i]; i++); if(p && name[i] == p->name[i]) { int a = 1; for(; name[i + a] == p->name[i + a]; a++); if(a == strlen(name)) { pa[s - 1] = p; // errore glob++; realloc(pa, sizeof(struct comp) * s + 1); if(!pa) { puts("Ricerca non completata.") goto ret; } } return 0; } } ret: return pa; }
|
Qual è l'errore in quell'assegnamento?
Ultima modifica effettuata da drewnik99 il 01/09/2011 alle 19:31 |
|
comina8 (Normal User)
Pro
Messaggi: 86
Iscritto: 18/06/2011
|
La variabile "ppa" non la usi da nessuna parte quindi puoi dichiarare solo "pa" assegnandole poi il ritorno della funzione malloc...
Inoltre non vedo nessuna free e nella funzione realloc devi passare "pa" non "*pa".
p non lo inizializzi (non usi la malloc).
Probabilmente il programma ti va in crash...
|
|
drewnik99 (Normal User)
Pro
Messaggi: 69
Iscritto: 28/03/2008
|
*ppa serve, perchè se il programma non riesce a riallocare la memoria, realloc restituisce un puntatore nullo e occorre un altro puntatore perchè la funzione restituisca la struttura.
L'errore lo restituisce il compilatore, durante la compilazione, non in esecuzione.
Perchè dovrei inizzializzare p con malloc?
|
|
comina8 (Normal User)
Pro
Messaggi: 86
Iscritto: 18/06/2011
|
Postato originariamente da drewnik99:
*ppa serve, perchè se il programma non riesce a riallocare la memoria, realloc restituisce un puntatore nullo e occorre un altro puntatore perchè la funzione restituisca la struttura.
L'errore lo restituisce il compilatore, durante la compilazione, non in esecuzione.
Perchè dovrei inizzializzare p con malloc? |
Perché dichiari un puntatore nullo e pretendi che punti a delle celle di memoria...
Ma che errore ti dà il compilatore che facciamo prima... |
|
drewnik99 (Normal User)
Pro
Messaggi: 69
Iscritto: 28/03/2008
|
Errore: incompatible types when assigning to type 'struct comp' from type 'struct comp *'|
Ultima modifica effettuata da drewnik99 il 01/09/2011 alle 19:35 |
|
drewnik99 (Normal User)
Pro
Messaggi: 69
Iscritto: 28/03/2008
|
Ho apportato le seguenti modifiche:
Codice sorgente - presumibilmente C++ |
struct comp *p = (struct comp*)malloc(sizeof(struct comp)); if(!p) { // } struct comp **pv = 0; struct comp ***point; int s; for(p = comps, s = 1; p; p = p->n, s++) { unsigned int i = 0; for(; name[i] != p->name[i]; i++); if(p && name[i] == p->name[i]) { unsigned int a = 1; for(; name[i + a] == p->name[i + a]; a++); if(a == strlen(name)) { pv = (struct comp **) realloc(pv, sizeof(struct comp*) * (s + 1)); if(!pv) { goto ret; } point = &pv; pv[s] = p; } continue; } } pv[0]->code = s; // l'elemento 0 funge da contatore degli ret: // elementi totali return point; }
|
Se volessi che la funzione restituisse questo vettore di strutture, in modo da poterlo utilizzare nella funzione principale, quali modifiche dovrei apllicare al codice?
Ultima modifica effettuata da drewnik99 il 02/09/2011 alle 0:58 |
|